package controller;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.*;

import model.AntHill;

import view.View;
import model.AntLion;
import model.BigAnt;
import model.Food;
import model.Game;
import model.HedgeHog;
import model.Lake;
import model.LittleAnt;
import model.MapElement;
import model.Rock;

public class MainFrame{
	public static Game game;
	public static boolean random=true;
	public static View view;
    public static JPanel gamecard=new JPanel();
    private static final int TIMER_DELAY = 50;
    public static boolean isgame=false;
    public static long tickcount=0;
    public static BufferedImage bufferedimage;
    public static Graphics buffer;
    public static JPanel highscorecard=new JPanel();
    public static JPanel menucard=new JPanel();
    public static JPanel gameovercard=new JPanel();
    public static CardLayout cardlayout=new CardLayout();
    final public static JPanel cards=new JPanel(cardlayout);
    public final static JTextField tf=new JTextField();
    static JTextArea ja= new JTextArea();



	private static void showGUI() throws IOException {
		
		//Beállítunk egy 600x625 pixel méretű ablakot
        JFrame frame = new JFrame("Hangyafarm");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 625);
        
        //A menü gombjai
        JButton newgamebutton=new JButton("New Game");
        JButton highscorebutton=new JButton("High score");
        final JButton backbutton=new JButton("Back");
        backbutton.addActionListener(new ActionListener(){
    		public void actionPerformed(ActionEvent e){
    			cardlayout.show(cards, "Main Menu");
    		}
    	});
        //A toplista megjelenítése, ha a gombra kattintottunk
        highscorebutton.addActionListener(new ActionListener() {
        	 
            public void actionPerformed(ActionEvent e)
            {
            	try {
            		//A kiíró függvény
					kiir();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
            	cardlayout.show(cards, "High Score");
            	
            	
            }
            });
        //Kilépés, ha a kilépés gombot megnyomtuk
        JButton exitbutton=new JButton("Exit");
        exitbutton.addActionListener(new ActionListener() {
       	 
            public void actionPerformed(ActionEvent e)
            {
            	System.exit(0);
            }
            });
        //Főmenü gombjainak beállítása
        newgamebutton.setMinimumSize(new Dimension(600,200));
        highscorebutton.setMinimumSize(new Dimension(600,200));
        exitbutton.setMinimumSize(new Dimension(600,200));
        
        newgamebutton.setMaximumSize(new Dimension(600,200));
        highscorebutton.setMaximumSize(new Dimension(600,200));
        exitbutton.setMaximumSize(new Dimension(600,200));
        
        newgamebutton.setPreferredSize(new Dimension(600,200));
        highscorebutton.setPreferredSize(new Dimension(600,200));
        exitbutton.setPreferredSize(new Dimension(600,200));
        
        //Az új játék gombhoz listener beregisztrálása
        newgamebutton.addActionListener(new ActionListener() {
 
            public void actionPerformed(ActionEvent e)
            {
                try {
                	//A gamecard mgejelenítése
                    cardlayout.show(cards, "The Game");            
                    view = new View(game,gamecard);
                    game = new Game(view);
                    isgame=true;
                    //A pálya betöltése
                    game.loadMap("map1.txt");
                    //A MapElement objektumokhoz tartozó View osztályok létrehozása
                    for(MapElement m: game.currentMap.mapelements){
                    	//Hangyaboly
                        if(m.getType().equalsIgnoreCase("anthill"))
                            view.createAntHillView((AntHill)m);
                        //Tó
                        if(m.getType().equalsIgnoreCase("lake"))
                            view.createLakeView((Lake)m);
                        //Kő
                        if(m.getType().equalsIgnoreCase("rock"))
                            view.createRockView((Rock)m);
                        //Kaja
                        if(m.getType().equalsIgnoreCase("food"))
                            view.createFoodView((Food)m);
                        //Hangyaleső
                        if(m.getType().equalsIgnoreCase("antlion"))
                            view.createAntLionView((AntLion)m);
                    }
                    //Hangyaszagsemlegesítő spray
              		game.view.createAntOdorKillerSprayView(game.killodor);
              		//hangyaírtó spray
              		game.view.createAntKillerSprayView(game.killspray);
                    
                    
                } catch (IOException ex) {
                    Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
        		           }
        });
        //Időzítés indítása, 50 ms-eként hívódik meg
        new javax.swing.Timer(TIMER_DELAY, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	if (game!=null)
            		gameLoop(gamecard);
            }
         }).start();
        
        //A főmenü gombjainak hozzáadása a panelhez
        menucard.setLayout(new BoxLayout(menucard,BoxLayout.PAGE_AXIS));
        menucard.add(newgamebutton);
        menucard.add(highscorebutton);
        menucard.add(exitbutton);
        
        //Játék vége panel megjelenítése
        gameovercard.setLayout(new BoxLayout(gameovercard,BoxLayout.LINE_AXIS));
        JLabel jl=new JLabel("ENTER NAME:");
        
        //A név elmentése, ha vége a játéknak
        JButton savename=new JButton("SAVE");
        jl.setMinimumSize(new Dimension(100,50));
        tf.setMinimumSize(new Dimension(380,50));
        savename.setMinimumSize(new Dimension(100,50));
        
        jl.setMaximumSize(new Dimension(100,50));
        tf.setMaximumSize(new Dimension(380,50));
        savename.setMaximumSize(new Dimension(100,50));
        
        jl.setPreferredSize(new Dimension(100,50));
        tf.setPreferredSize(new Dimension(380,50));
        savename.setPreferredSize(new Dimension(100,50));
        
        //A mentésgombhoz listener beregisztrálása
        savename.addActionListener(new ActionListener() {
       	 
            public void actionPerformed(ActionEvent e)
            {
            	
				try {
					BufferedWriter out;
					out = new BufferedWriter(new FileWriter("highscores.txt",true)); 
	            	out.write(tf.getText()+"\t\t"+tickcount+"\n");
	            	out.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
					
				} 
				gameovercard.setVisible(false);
				//A név mentése után a toplista megjelenítése
				cardlayout.show(cards, "High Score");
				cards.repaint();
				//A játékhoz tartozó változók nullázása, hogy új játékkor ne legyen gond
				tickcount=0;
				game=null;
				view=null;
				try {
					kiir();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
            }
            });
        
        //Játék vége panel felépítése
        gameovercard.add(jl);
        gameovercard.add(tf);
        gameovercard.add(savename);
        
        //Egérkattintás figyelése játék közben
        gamecard.addMouseListener(new MouseListener(){
        	public void mousePressed(MouseEvent e) {
        		//Bal klikkre hangyaírtóspray használata
     	       if (e.getButton()==MouseEvent.BUTTON1){
     	    	   game.killspray.useSpray(e.getX(),e.getY());
     	       }
     	       //Jobbklikkre hanygaszagsemlegesítő spray használata
     	       if (e.getButton()==MouseEvent.BUTTON3){
     	    	   game.killodor.useSpray(e.getX(),e.getY());
     	       }
     	    }

			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}

			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
        });
        
        //A toplistából a főmenübe vivő gomb elkészítése
        JButton backButton=new JButton("Back");
        //a hozzá tartozó listener beregisztrálása
        backButton.addActionListener(new ActionListener() {
       	 
            public void actionPerformed(ActionEvent e)
            {
            	//a tpolista eltüntetése
            	highscorecard.setVisible(false);
            	//A főmenü megjelenítése
            	cardlayout.show(cards, "Main Menu");
            	//újrarajzolás
            	cards.repaint();
            }
            });
        
        //A toplista panel felépítése
        highscorecard.add(ja,BorderLayout.CENTER);
        highscorecard.add(backButton,BorderLayout.SOUTH);
        //A panelek hozzáadása a cardlayoutot használó főpanelhez
        cards.add(menucard, "Main Menu");
        cards.add(gamecard,"The Game");
        cards.add(highscorecard,"High Score");
        cards.add(gameovercard,"Game Over");
        //A főpanel hozzáadása az ablakhoz
        frame.getContentPane().add(cards);
        
        //Az ablak átméretezhetőségének tiltása
        frame.setResizable(false);
        //Az ablak megjelenítése
        frame.setVisible(true);
    }
	
	//A program belépési pontja
      public static void main(String[] args){
    	  
    	 SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                  try {
                	  //Az ablak megjelenítése
					showGUI();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
                  
              }
    	 });
      
      }
      //Az 50 ms-enként meghívódó függvény, lényegében ez vezérli a játékot
      public static void gameLoop(JPanel gamecard) {

    	  //A buffer beállítása, hogy ne villogjon a kép
          bufferedimage=new BufferedImage(600,600,1);
          buffer=bufferedimage.getGraphics();
          //Ha este van, sötétzöld legyen a háttér
          if (game.currentMap.isItNight())
        	  buffer.setColor(new Color(0,80,0));
          //Ha nappal, akkor világoszöld
          if (!game.currentMap.isItNight())
        	  buffer.setColor(Color.GREEN);
    	  buffer.fillRect(0,0,600,600);
    	  buffer.setColor(Color.BLACK);
    	  //Eltelt idő kiírása a jobb felső sarokba
    	  buffer.drawString(Long.toString(tickcount/20)+"s", 550, 20);
    	  //Ha megy a játék
    	  if(isgame){
    		  //Kirajzoljuk a bufferbe a játékelemeket
  		view.paintComponent(buffer);
  		//Ha nincs vége a játéknak, akkor kirajzoljuk a bufferben lévő képet
  		if(!game.gameover)gamecard.getGraphics().drawImage(bufferedimage, 0, 0, null);
  		
  		//5 mp-enkén elindítunk egy hangyát
  		if(tickcount%100==0){
  			//70% valószínűséggel kishangya indul
		if(Math.random()>=0.3){
			//Kishangya létrehozása
			LittleAnt la=(LittleAnt)game.gameobjectfactory.createGameObject("LittleAnt");
			//A hozzá tartozó LittleAntView létrehozása
			game.view.createLittleAntView(la);
		}
		
		else {
			//30% valószínűséggel nagyhangya indul
			//Nagyhangya létrehozása
			BigAnt ba=(BigAnt)game.gameobjectfactory.createGameObject("BigAnt");
			//A hozzá tartozó BigAntView létrehozása
			game.view.createBigAntView(ba);
		
  		}
  		}
  		//A legelején elindítjuk a hangyászsünt
		if(tickcount==0){
		HedgeHog h1 = (HedgeHog) game.gameObjects.get(0);
		h1.setActive(true);
		//A hozzá tartozó HedgeHogView
		game.view.createHedgeHogView(h1);
		}
		//növeljük a tickszámlálót
  		tickcount++;
		try {
			//Ha játék vége van
			if(game.gameover){
				//láthatatlanná tesszük a játék paneljét
				gamecard.setVisible(false);
				//megjelenítjük a játék vége panel, ahol el lehet menteni a nevünket
				cardlayout.show(cards, "Game Over");
				//újrarajzolás
				cards.repaint();
				
			}
			//Ha nincs játék vége, meghívjuk a tick() függvényt a mozgásokhoz
			else game.time.tick();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	  }
       }
      
      //A toplista megjelenítéséhez segédfüggvény
      public static void kiir() throws IOException{
    	  //Beolvassuk a meglévő toplista fájlból az eddigi eredményeket
    	  FileInputStream input = new FileInputStream("highscores.txt");
          BufferedReader reader = new BufferedReader(new InputStreamReader(input));
          StringWriter writer = new StringWriter();
          PrintWriter out = new PrintWriter(writer);
          String line;
          //Soronként kiírjuk a képernyőre
          while ((line = reader.readLine()) != null)  {
            out.println(line);
          }
          out.flush();
          reader.close();
          ja.setText(writer.toString());
      }
      
      
}
    	  
    	  	
            
      
      
      

 
